#include <iostream>

using namespace std;

// 集成、多台
class Anim {
public:
    void test() {}
};

class Run {
public:
    // 虚函数：构造方法不要声明为虚函数
    // 析构方法需要声明为虚函数，为了释放内存时不会调用错误
    virtual void run() {
        cout << "parent run" << endl;
    }

    // 纯虚函数，类似于java的抽象方法
    virtual void test() = 0;
};

// Dog继承Anim,可以指定作用域，默认为private私有继承
// 私有继承，父类所有属性、方法对于Dog来说都是私有的，Dog无法使用
// C++ 允许多继承
class Dog : private Anim, public Run {
public:
    void run() override {
        // 调用父类的方法
        // Run::run();
        cout << "child run" << endl;
    }

    void test() override {
        cout << "child test" << endl;
    }
};

// 模板编程：泛型的基础，函数模板(java泛型方法)
// 可以使用typename或者class声明
template<typename T>
T max(T a, T b) {
    return a > b ? a : b;
}

// 类模板(泛型类)
template<class T, class E>
class Test {
public:
    T test(T t, E e) {
        return t + e;
    }
};


int main25() {
    Run *run = new Dog;
    // 此时调用父类的run方法，静态多台：在编译期间就决定了函数的调用地址，不管run的真实类型
    // 要想让run调用到真实对象Dog，改为动态多态，在运行时确定类型，需要使用虚函数，使用virtual修改父类的方法
    run->run();
    delete run;
    run = 0;

    return 0;
}